Skip to content

Align the spec on open-ended catalog and entry objects (ADR-0028) - #131

Open
tadasant wants to merge 6 commits into
mainfrom
tadasant/unrecognized-members
Open

tadasant wants to merge 6 commits into
mainfrom
tadasant/unrecognized-members

Conversation

@tadasant

@tadasant tadasant commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Align the spec on what it already says: the AI Catalog top-level object and Catalog Entry objects are open to members the specification does not define. The prose has said so all along (Version Handling, the signed-payload rules, Catalog Snapshot Coverage, the CDDL preamble); ADR-0012's "closed" decision never made it into the spec text; and the 2026-11-05 AI Catalog call confirmed open is the intent. This PR adds the one section that says what a consumer does with such members, makes the CDDL match, and records the decision in ADR-0028.

Context, rationale, trade-offs, alternatives, and the meeting reference are all in adr/0028-open-catalog-and-entry-objects.md.

What to review

  • specification/ai-catalog.md — new Unrecognized Members section before Version Handling (four consumer rules, no-stability-guarantee, trust and signing, comparison with extensions, two non-normative examples). It answers the retransmission question raised on the call: carry, best effort (SHOULD preserve). The AICatalog, CatalogEntry, HostInfo, and Publisher CDDL maps gain * text => any; the Trust Manifest maps stay as they are. One-line pointers added to the member lists, the Extensions intro, Version Handling, Subject, and Publisher and Policy Metadata.
  • adr/0028-...md — status Accepted. Records the colon-or-@ producer rule floated on the call as a possible later refinement, not adopted, per "for 0.9, say nothing more."
  • docs/guides/* — a short "Members beyond the specification" subsection and a one-line checklist tweak.

Additive; no existing catalog document changes meaning or validity. The broader namespace proposal (#135) is deferred to the 1.0 discussion and untouched here.

Open questions

  1. SHOULD vs. MAY for preservation on retransmission, given strongly typed SDK bindings. Currently SHOULD.
  2. Should conformance tooling warn on unrecognized members by default? Currently MAY.

Verification

uv run tools/build_spec.py builds with all new anchors resolving and no dangling internal links; uv run --group docs mkdocs build --strict passes. Rebased onto main after #136.

🤖 Generated with Claude Code

github-actions Bot added a commit that referenced this pull request Oct 29, 2026
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Preview: https://ai-catalog.io/pr/131/

This comment is updated automatically while the pull request preview is available.

tadasant and others added 2 commits November 6, 2026 15:27
…-0028)

Exploratory draft. The prose already tells consumers to ignore unrecognized
fields and to retain them in signed payloads, but the CDDL maps for
AICatalog and CatalogEntry are closed. This makes both maps explicitly open
(`* text => any`), adds an Unrecognized Members section with four consumer
rules (do not reject, derive no core semantics, preserve on republication,
retain in signed payloads), states that undefined names carry no stability
guarantee and are outside the Trust Manifest subject, and keeps
`extensions` as the only extension point the specification defines.

Adds ADR-0028 with rationale, trade-offs and alternatives, and updates the
creating/consuming guides.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…TSC outcome

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@tadasant
tadasant force-pushed the tadasant/unrecognized-members branch from 28ed24e to 9006f28 Compare November 6, 2026 15:28
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
@tadasant tadasant changed the title Draft: open the catalog and entry objects to unrecognized members (ADR-0028) Align the spec on open-ended catalog and entry objects (ADR-0028) Nov 6, 2026
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
…ample

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
github-actions Bot added a commit that referenced this pull request Nov 6, 2026
@tadasant
tadasant marked this pull request as ready for review November 6, 2026 15:51
@tadasant
tadasant requested a review from a team as a code owner November 6, 2026 15:51
@jdamick

jdamick commented Nov 6, 2026

Copy link
Copy Markdown

nice! lgtm

@jonathanhefner jonathanhefner left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Insofar as we want to support open-ended objects, I think these changes look good. Just a few nitpicks.

Comment on lines +1453 to +1454
This section states what an unrecognized member means to a consumer of
this specification, which is nothing, and what a consumer does with it.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This section states what an unrecognized member means to a consumer of
this specification, which is nothing, and what a consumer does with it.

Comment on lines +1499 to +1501
An unrecognized member on a Catalog Entry or its Publisher object is not
covered by any Trust Manifest `subject` and is not a claim of the entry's publisher unless
another specification says so. A catalog signature covers unrecognized

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An unrecognized member on a Catalog Entry or its Publisher object is not
covered by any Trust Manifest subject and is not a claim of the entry's publisher unless
another specification says so.

This is covered by the definition of subject, so I'm not sure that we need to repeat it here. But what we can say is that unrecognized members within a Trust Manifest are signed as part of that Trust Manifest (and unrecognized members anywhere within a Catalog are signed as part of that Catalog).

Comment on lines +1511 to +1515
| Defined by this specification | Yes: key rules and official extensions | No |
| Can collide with a future core member | No, keys are namespaced | Yes, no stability guarantee |
| Meaning to a consumer of this specification | Whatever the extension defines | None |
| Handling | Ignore unknown keys; retain in signed payloads | Ignore; preserve on republication; retain in signed payloads |
| Intended for | Publisher-owned, named extensions | Outside conventions, local annotations, experimentation |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bold in the left column values might make this easier to read.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants